package git.soulbgm.common;

import okhttp3.HttpUrl;

import java.util.Arrays;
import java.util.List;

/**
 * 常量
 *
 * @author SoulBGM
 * @date 2021/02/01
 */
public final class MonitorConstants {

    public static final String HEALTH_CHECK_URL = "/heartbeat";
    public static final String SERVER_INFO_URL = "/info";
    public static final String EXEC_URL = "/exec";
    public static final String IS_ALIVE_URL = "/isAlive";
    public static final String TIME_SYNC_URL = "/ntpdate";
    public static final String SHELL_LL = "ls -lt --time-style='+%Y-%m-%d-%H-%M-%S-%3N' {}|grep -v 总用量";
    public static final String SHELL_RECURSION_LL_FILE = "ls -lRt {}|grep -Ev '^d|总用量|^$'|awk '{ if($1~/^\\//) { sub(\":\",\"/\",$1); prefix = $1 } else if ($1~/^-/) {print prefix$9} }'";

    /**
     * 产生告警的Kafka主题
     */
    public static final String TOPIC_PRODUCE_ALARM = "produce_alarm";

    /**
     * 产生告警的Kafka主题
     */
    public static final String TOPIC_CLEAR_ALARM = "clear_alarm";

    /**
     * 系统类型 Linux
     */
    public static final int SYSTEM_LINUX = 1;

    /**
     * 系统类型 Windows
     */
    public static final int SYSTEM_WINDOWS = 1;

    /**
     * 系统类型 Mac
     */
    public static final int SYSTEM_MAC = 1;

    /**
     * 规则类型 设备(monitor-agent)
     */
    public static final String RULE_TYPE_NODE = "node";

    /**
     * 规则类型 服务
     */
    public static final String RULE_TYPE_SERVICE = "service";

    /**
     * 规则类型 软件
     */
    public static final String RULE_TYPE_SOFTWARE = "software";

    /**
     * 规则类型 连接
     */
    public static final String RULE_TYPE_CONNECTION = "connection";

    /**
     * 规则类型 业务
     */
    public static final String RULE_TYPE_BUSINESS = "business";

    /**
     * 资源名称 monitor-agent
     */
    public static final String MONITOR_AGENT = "monitor-agent";

    /**
     * 监控代理访问默认端口
     */
    public static final int MONITOR_AGENT_DEFAULT_PORT = 9300;

    /**
     * SSH访问默认端口
     */
    public static final int SSH_DEFAULT_PORT = 22;

    /**
     * SSH默认用户名
     */
    public static final String SSH_DEFAULT_USERNAME = "agent";

    /**
     * SSH默认密码
     */
    public static final String SSH_DEFAULT_PASSWORD = "agentPass";

    /**
     * 区域默认编号
     */
    public static final int REGION_DEFAULT_CODE = 0;

    /**
     * 健康检查默认URL
     */
    public static final String HEALTH_CHECK_DEFAULT_URL = HEALTH_CHECK_URL;

    /**
     * 默认启动服务的预计时间
     */
    public static final int ESTIMATED_STARTUP_TIME_DEFAULT_SERVICE = 30;

    /**
     * 默认启动监控代理的预计时间
     */
    public static final int ESTIMATED_STARTUP_TIME_DEFAULT_AGENT = 30;

    /**
     * 默认启动软件的预计时间
     */
    public static final int ESTIMATED_STARTUP_TIME_DEFAULT_SOFTWARE = 30;

    /**
     * 软件脚本默认根路径
     */
    public static final String SOFTWARE_SCRIPT_DEFAULT_ROOT_PATH = "/home/";

    /**
     * 启动脚本默认路径
     */
    public static final String STARTUP_SCRIPT_DEFAULT_PATH = "/start.sh";

    /**
     * 停止脚本默认路径
     */
    public static final String STOP_SCRIPT_DEFAULT_PATH = "/stop.sh";

    /**
     * 日志默认路径
     */
    public static final String LOG_DEFAULT_PATH = "/logs";

    /**
     * 监控模式 被动
     */
    public static final int MONITOR_MODE_PASSIVITY = 1;

    /**
     * 监控模式 主动
     */
    public static final int MONITOR_MODE_ACTIVE = 2;

    /**
     * 一秒毫秒
     */
    public static final int ONE_SECONDS_MILLISECOND = 1000;

    /**
     * 事件编号 CPU使用率
     */
    public static final String EVENT_CODE_CPU = "cpu";

    /**
     * 事件编号 内存使用率
     */
    public static final String EVENT_CODE_MEM = "memory";

    /**
     * 事件编号 磁盘使用率
     */
    public static final String EVENT_CODE_DISK = "disk";

    /**
     * 事件编号 上行带宽
     */
    public static final String EVENT_CODE_UPLOAD_BPS = "upload_bps";

    /**
     * 事件编号 下行带宽
     */
    public static final String EVENT_CODE_DOWNLOAD_BPS = "download_bps";

    /**
     * 事件编号 设备重启
     */
    public static final String EVENT_CODE_NODE_REBOOT = "node_reboot";

    /**
     * 事件编号 设备宕机
     */
    public static final String EVENT_CODE_NODE_SHUTDOWN = "node_shutdown";

    /**
     * 事件编号 时间同步服务器无法访问
     */
    public static final String EVENT_CODE_TIME_SYNC_SERVER_NOT_ACCESS = "time_sync_server_not_access";

    /**
     * 事件编号 时间同步失败
     */
    public static final String EVENT_CODE_TIME_SYNC_FAIL = "time_sync_fail";

    /**
     * 事件编号 时间同步超限
     */
    public static final String EVENT_CODE_TIME_SYNC_EXCEED_LIMIT = "time_sync_exceed_limit";

    /**
     * 事件编号 服务重启
     */
    public static final String EVENT_CODE_SERVICE_REBOOT = "service_reboot";

    /**
     * 事件编号 服务宕机
     */
    public static final String EVENT_CODE_SERVICE_SHUTDOWN = "service_shutdown";

    /**
     * 事件编号 服务线程阻塞
     */
    public static final String EVENT_CODE_SERVICE_THREAD_BLOCKING = "service_thread_blocking";

    /**
     * 事件编号 软件重启
     */
    public static final String EVENT_CODE_SOFTWARE_REBOOT = "software_reboot";

    /**
     * 事件编号 软件宕机
     */
    public static final String EVENT_CODE_SOFTWARE_SHUTDOWN = "software_shutdown";

    /**
     * 事件编号 设备接口ping不通
     */
    public static final String EVENT_CODE_EQUIPMENT_PING_FAILURE = "equipment_unable_connect";

    /**
     * 处理完成
     */
    public static final int HANDLE_COMPLETE = 1;

    /**
     * 未处理
     */
    public static final int HANDLE_NO = 0;

    /**
     * 处理类型 机器
     */
    public static final int HANDLE_TYPE_MACHINE = 1;

    /**
     * 处理类型 人工
     */
    public static final int HANDLE_TYPE_ARTIFICIAL = 2;

    /**
     * 机器参与
     */
    public static final int MACHINE_PARTICIPATION = 1;
    /**
     * 机器不参与
     */
    public static final int MACHINE_NOT_PARTICIPATION = 0;
    /**
     * 唯一
     */
    public static final String UNIQUE = "0";
    /**
     * 不唯一
     */
    public static final String NOT_UNIQUE = "1";
    /**
     * 检查唯一的节点编号
     */
    public static final int CHECK_UNIQUE_NODE_CODE = 1;
    /**
     * 检查唯一的IP
     */
    public static final int CHECK_UNIQUE_IP = 2;

    /**
     * 没有脚本文件
     */
    public static final String NOT_SCRIPT_FILE = "没有那个文件或目录";
    /**
     * 连接超时
     */
    public static final String CONNECTION_TIMED_OUT = "Connection timed out: connect";
    /**
     * 连接超时
     */
    public static final String CONNECT_TIMED_OUT = "connect timed out";
    /**
     * 身份验证失败
     */
    public static final String AUTH_FAIL = "Auth fail";
    /**
     * 不支持操作
     */
    public static final String NOT_SUPPORT_OPERATION = "不支持除Linux系统外的主机进行远程操作";
    /**
     * 不进行自启
     */
    public static final String NOT_SELF_START = "不进行自启";
    /**
     * 在线
     */
    public static final int ONLINE = 1;
    /**
     * 离线
     */
    public static final int OFFLINE = 2;
    /**
     * 会话的用户名
     */
    public static final String SESSION_USERNAME = "username";
    /**
     * 会话锁
     */
    public static final String SESSION_LOCK = "lock";
    /**
     * 链接 屏幕锁
     */
    public static final String URI_LOCKSCREEN = "lockscreen";
    /**
     * 链接 解锁屏幕
     */
    public static final String URI_UNLOCK_SCREEN = "unlockScreen";

    /**
     * 节点状态 正常
     */
    public static final String NODE_STATUS_NORMAL = "normal";
    /**
     * 节点状态 异常
     */
    public static final String NODE_STATUS_ABNORMAL = "abnormal";
    /**
     * 显示 节点状态
     */
    public static final String SHOW_NODE = "node";
    /**
     * 显示 服务状态
     */
    public static final String SHOW_SERVICE = "service";
    /**
     * 显示 软件状态
     */
    public static final String SHOW_SOFTWARE = "software";
    /**
     * 显示 告警内容
     */
    public static final String SHOW_ALARM = "alarm";

    /**
     * 告警等级 一般
     */
    public static final int ALARM_LEVEL_GENERAL = 1;
    /**
     * 告警等级 重要
     */
    public static final int ALARM_LEVEL_PRIMARY = 2;
    /**
     * 告警等级 严重
     */
    public static final int ALARM_LEVEL_SERIOUS = 3;
    /**
     * 告警等级 所有
     */
    public static final int[] ALARM_LEVEL_ALL = {ALARM_LEVEL_GENERAL, ALARM_LEVEL_PRIMARY, ALARM_LEVEL_SERIOUS};
    /**
     * 告警计数缓存过期时间
     */
    public static final int ALARM_COUNT_CACHE_EXPIRE_TIME = 15;

    /**
     * 系统配置参数 value
     */
    public static final int SYS_CONFIG_PARAM_VALUE = 1;
    /**
     * 系统配置参数 List
     */
    public static final int SYS_CONFIG_PARAM_LIST = 2;
    /**
     * 系统配置参数 Map
     */
    public static final int SYS_CONFIG_PARAM_MAP = 3;

    /**
     * Redis Key 节点最新资源使用情况
     */
    public static final String REDIS_KEY_NODE_NOW_USED = "node:now:used";
    /**
     * Redis Key 节点最新资源使用情况
     */
    public static final String REDIS_KEY_NODE_DISK_PREDICT = "node:disk:predict";
    /**
     * Redis Key 告警分组数量
     */
    public static final String REDIS_KEY_ALARM_GROUP_COUNT = "alarm:group:count:";
    /**
     * 告警计数的key key: alarm:count:告警规则ID:告警资源(告警对象)
     */
    public static final String REDIS_KEY_ALARM_COUNT = "alarm:count:";
    /**
     * 告警未处理的key key: alarm:untreated:告警规则ID:告警资源(告警对象)
     */
    public static final String REDIS_KEY_ALARM_UNTREATED = "alarm:untreated:";

    /**
     * 通过触发事件获取触发的内容
     *
     * @param eventCode 事件编号
     * @return {@link String}
     */
    public static String getEventContent(String eventCode) {
        String triggeringContent = "未知";
        if (EVENT_CODE_CPU.equals(eventCode)) {
            triggeringContent = "CPU使用率超出";
        } else if (EVENT_CODE_MEM.equals(eventCode)) {
            triggeringContent = "内存使用率超出";
        } else if (EVENT_CODE_DISK.equals(eventCode)) {
            triggeringContent = "磁盘使用率超出";
        } else if (EVENT_CODE_UPLOAD_BPS.equals(eventCode)) {
            triggeringContent = "上行带宽超出";
        } else if (EVENT_CODE_DOWNLOAD_BPS.equals(eventCode)) {
            triggeringContent = "下行带宽超出";
        } else if (EVENT_CODE_TIME_SYNC_SERVER_NOT_ACCESS.equals(eventCode)) {
            triggeringContent = "时间同步服务器无法访问";
        } else if (EVENT_CODE_TIME_SYNC_FAIL.equals(eventCode)) {
            triggeringContent = "时间同步失败";
        } else if (EVENT_CODE_TIME_SYNC_EXCEED_LIMIT.equals(eventCode)) {
            triggeringContent = "时间同步超限";
        }
        return triggeringContent;
    }

    /**
     * 获得整数类型的查询参数如果不存在返回默认值
     *
     * @param url           url
     * @param parameterName 参数名字
     * @param defaultVal    默认值
     * @return int
     */
    public static int getIntQueryParam(HttpUrl url, String parameterName, Integer defaultVal) {
        String valStr = url.queryParameter(parameterName);
        int val = defaultVal;
        if (valStr != null) {
            val = Integer.parseInt(valStr);
        }
        return val;
    }

    /**
     * 获得整数类型数组查询参数
     *
     * @param url           url
     * @param size          大小
     * @param parameterName 参数名称
     * @param defaultVal    默认瓦尔
     * @return {@link int[]}
     */
    public static int[] getIntArrayQueryParam(HttpUrl url, int size, String parameterName, Integer defaultVal) {
        String valStr = url.queryParameter(parameterName);
        int[] valArray = new int[size];
        if (valStr != null) {
            String[] array = valStr.split(",");
            for (int i = 0; i < array.length; i++) {
                valArray[i] = Integer.parseInt(array[i]);
            }
        } else {
            Arrays.fill(valArray, defaultVal);
        }
        return valArray;
    }

    /**
     * 是否超出阈值
     *
     * @param thresholdList 阈值列表
     * @param used          当前阈值
     * @return boolean
     */
    public static boolean isExceed(List<Double> thresholdList, Double used) {
        boolean flag = false;
        for (Double threshold : thresholdList) {
            if (threshold <= used) {
                flag = true;
                break;
            }
        }
        return flag;
    }

}
